// const aSet = new Set([1, 2, 3, 2, 5])
// console.log([...aSet])
// for (const item of aSet) {
//   console.log(item)
// }

// Map类似对象的结构
// Symbol
// const symbol1 = Symbol()
// // const symbol2 = Symbol()
// // console.log(symbol1 === symbol2)
// const aMap = new Map();
// aMap.set('a', '1')
// aMap.set(true, '2')
// aMap.set(symbol1, 'symbol')
// for (const [key, value] of aMap) {
//   console.log(key, value)
// }

// const arr = [];
// console.log(arr, 'arr')
// console.log(aMap, 'map')
// const iterator = aMap[Symbol.iterator]();
// console.log(iterator.next(), 'set1')
// console.log(iterator.next(), 'set2')
// console.log(iterator.next(), 'set3')
// console.log(iterator.next(), 'set4')
// console.log(iterator.next(), 'set5')
// console.log(iterator.next(), 'set6')
// console.log({}, 'obj')
// for (const iterator of {}) {
//   console.log(iterator)
// }

// const obj = { a: 1, b: 2 }

// const num = 123
// num.toString()

// Number.prototype.toString = function() {
//   console.log(this)
// }

// Object.prototype[Symbol.iterator] = function () {
//   const data = Object.entries(this);
//   // [['a',1],['b',2]]
//   let index = 0;
//   return {
//     next: function () {
//       return {
//         value: data[index],
//         done: index++ > data.length
//       }
//     }
//   }
// }

// for (const iterator of obj) {
//   console.log(iterator)
// }

// Proxy vs Object.defineProperty
// 1. Object.defineProperty只能监听到读写操作， proxy能监听到更多的操作
// const obj = { a: 1, b: 2 }
// obj.a = '1'
// delete obj.b

// const obj = {
//   a: 1, b: 2
// }

// const objProxy = new Proxy(obj, {
//   get(target, property) {
//     console.log('get', target, property)
//     return target[property]
//   },
//   set(target, property, value) {
//     console.log('set')
//     target[property] = value
//   },
//   deleteProperty(target, property) {
//     console.log('delete', target, property)
//     delete target[property]
//   }
// })
// console.log(objProxy.a, 'proxy')
// objProxy.a = '123'
// console.log(objProxy.a, 'proxy')
// delete objProxy.a
// console.log(objProxy.a, 'proxy')

// data () {
//   return {
//     title: 1,
//     des: 'xxx',
//     list: ['1','2']
//   }
// }

// const obj = {
// }

// let arr = [1, 2, 3]



// Object.defineProperty(obj, 'arr', {
//   set() {
//     console.log('defineProperty set')
//   },
//   get() {
//     return arr
//   }
// })
// console.log(obj.arr)
// obj.arr.push('345')
// let arr = [1, 2, 3]
// const arrProxy = new Proxy(arr, {
//   get(target, property) {
//     return Reflect.get(target, property)
//   },
//   set(target, property, value) {
//     console.log('set', target, property)
//     target[property] = value
//     return true
//   }
// })
// console.log(arrProxy[0])
// Proxy

// 对象
const obj = { a: 1, b: 2 }
// Reflect
// console.log('a' in obj)
// console.log(Reflect.has(obj, 'a'))
// console.log(obj.a)
// console.log(Reflect.set(obj, 'a', '2'))
// console.log(obj)
// obj.a = '123'
// console.log(Reflect.get(obj, 'a'))
// console.log(Object.keys(obj))
// console.log(Reflect.ownKeys(obj))

